// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/message_center/views/padded_button.h"

#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/message_center/message_center_style.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/painter.h"

namespace message_center {

PaddedButton::PaddedButton(views::ButtonListener* listener)
    : views::ImageButton(listener)
{
    SetFocusable(true);
    set_request_focus_on_press(false);
    SetFocusPainter(views::Painter::CreateSolidFocusPainter(
        kFocusBorderColor,
        gfx::Insets(1, 2, 2, 2)));
}

PaddedButton::~PaddedButton()
{
}

void PaddedButton::SetPadding(int horizontal_padding, int vertical_padding)
{
    padding_.Set(std::max(vertical_padding, 0),
        std::max(horizontal_padding, 0),
        std::max(-vertical_padding, 0),
        std::max(-horizontal_padding, 0));
}

void PaddedButton::SetNormalImage(int resource_id)
{
    SetImage(views::CustomButton::STATE_NORMAL,
        ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
            resource_id));
}

void PaddedButton::SetHoveredImage(int resource_id)
{
    SetImage(views::CustomButton::STATE_HOVERED,
        ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
            resource_id));
}

void PaddedButton::SetPressedImage(int resource_id)
{
    SetImage(views::CustomButton::STATE_PRESSED,
        ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
            resource_id));
}

gfx::Size PaddedButton::GetPreferredSize() const
{
    return gfx::Size(message_center::kControlButtonSize,
        message_center::kControlButtonSize);
}

void PaddedButton::OnPaint(gfx::Canvas* canvas)
{
    // This is the same implementation as ImageButton::OnPaint except
    // that it calls ComputePaddedImagePaintPosition() instead of
    // ComputeImagePaintPosition(), in effect overriding that private method.
    View::OnPaint(canvas);
    gfx::ImageSkia image = GetImageToPaint();
    if (!image.isNull()) {
        gfx::Point position = ComputePaddedImagePaintPosition(image);
        if (!background_image_.isNull())
            canvas->DrawImageInt(background_image_, position.x(), position.y());
        canvas->DrawImageInt(image, position.x(), position.y());
    }
    views::Painter::PaintFocusPainter(this, canvas, focus_painter());
}

void PaddedButton::OnFocus()
{
    views::ImageButton::OnFocus();
    ScrollRectToVisible(GetLocalBounds());
}

gfx::Point PaddedButton::ComputePaddedImagePaintPosition(
    const gfx::ImageSkia& image)
{
    gfx::Vector2d offset;
    gfx::Rect bounds = GetContentsBounds();
    bounds.Inset(padding_);

    if (padding_.left() == 0 && padding_.right() == 0)
        offset.set_x((bounds.width() - image.width()) / 2); // Center align.
    else if (padding_.right() > 0)
        offset.set_x(bounds.width() - image.width()); // Right align.

    if (padding_.top() == 0 && padding_.bottom() == 0)
        offset.set_y((bounds.height() - image.height()) / 2); // Middle align.
    else if (padding_.bottom() > 0)
        offset.set_y(bounds.height() - image.height()); // Bottom align.

    return bounds.origin() + offset;
}

} // namespace message_center
